/**
* Universidade de Brasilia
* 2013.1
* Trabalho de Programacao Orientada a Objetos
* Professor: Fernando Chacon
* Alunos
*   Lucas Lo Ami Alvino Silva - 09/0009886
*   <Melinho colocar seu nome aqui>
*
*/
#include "../include/MN.h"



MN::MN()
{
    //ctor
}

MN::~MN()
{
    //dtor
}


EErroMN::EErroMN(string mensagem)
{

    this->mensagem = mensagem;
}

string EErroMN::oQue()
{
    return mensagem;
}

//-----------------------------------------------------------------------------------------
// METODOS DO MNCONTA
//-----------------------------------------------------------------------------------------
string MNConta::autenticar(Senha senha, NumeroConta numeroConta)
{
    Conta conta;
    conta.setSenha(senha);
    conta.setNumeroConta(numeroConta);

    /*ComandoAutenticarConta comando(conta);
    try {
        comando.executar();
        Conta contaRetorno;
        contaRetorno = comando.getResultado();
        return contaRetorno.getNumeroConta().getInput();

    }
    catch(EErroPersistencia exp) {
        cout << endl << exp.oQue();
        cout << endl << endl << "Digite algo para continuar.";
        getch();
    }*/
}

Conta MNConta::getConta(NumeroConta numeroConta)
{
    Conta conta;
    conta.setNumeroConta(numeroConta);
    ComandoPegarConta comando(conta);

    /*try {
        comando.executar();
        Conta contaRetorno;
        contaRetorno = comando.getResultado();
        return contaRetorno;


    }
    catch(EErroPersistencia exp) {
        cout << endl << exp.oQue();
        cout << endl << endl << "Digite algo para continuar.";
        getch();
    }*/
}

string MNConta::alterarSenha(Senha senha, Conta conta)
{
    conta.setSenha(senha);
    ComandoAlterarSenhaConta comando(conta);

    /*try {
        comando.executar();
        Conta contaRetorno;
        contaRetorno = comando.getResultado();
        return contaRetorno.getSenha().getInput();


    }
    catch(EErroPersistencia exp) {
        cout << endl << exp.oQue();
        cout << endl << endl << "Digite algo para continuar.";
        getch();
    }*/
}

Conta MNConta::sacar(Dinheiro valor, Conta conta) throw (EErroMN)
{
    float saldo;
    float limiteCredito;
    float valor_float;
    stringstream ss;

    saldo = atof(conta.getSaldo().getInput().c_str());
    limiteCredito = atof(conta.getLimiteCredito().getInput().c_str());
    valor_float = atof(valor.getInput().c_str());

    if (valor_float <= (saldo + limiteCredito)) {
        ss << (saldo - valor_float);
        conta.setSaldo(ss.str());

        ComandoSaque comando(conta);
        /*try {
            comando.executar();
            //Conta contaRetorno;
            //contaRetorno = comando.getResultado();
            return conta;


        }
        catch(EErroPersistencia exp) {
            cout << endl << exp.oQue();
            cout << endl << endl << "Digite algo para continuar.";
            getch();
        }*/
    }
    throw EErroMN("Voce nao te saldo suficiente para efetuar esse saque!");
}

Conta MNConta::depositar(Dinheiro valor, Conta conta) throw(EErroMN)
{
    float saldo;
    //float limiteCredito;
    float valor_float;
    stringstream ss;

    saldo = atof(conta.getSaldo().getInput().c_str());
    //limiteCredito = atof(conta.getLimiteCredito().getInput().c_str());
    valor_float = atof(valor.getInput().c_str());

    ss << (saldo + valor_float);
    conta.setSaldo(ss.str());

    ComandoDeposito comando(conta);
    /*try {
        comando.executar();
        //Conta contaRetorno;
        //contaRetorno = comando.getResultado();
        return conta;


    }
    catch(EErroPersistencia exp) {
        cout << endl << exp.oQue();
        cout << endl << endl << "Digite algo para continuar.";
        getch();
    }*/

    throw EErroMN("Voce nao te saldo suficiente para efetuar esse saque!");
}

string MNConta::agendarPag(CodigoPagamento cod, Data data, Dinheiro valor, Conta conta)
{
    Pagamento pag;
    CodigoPagamento proxCod;
    float codFloat = 0.0;
    stringstream ss;


    pag.setCodigoPagamento(cod);
    pag.setData(data);
    pag.setValor(valor);

    /*ComandoPegarUltimoPagamento comando();
    try {
        comando.executar();
        Pagamento ultimoPag;
        ultimoPag = comando.getResultado();
        //testar se retornou pagamento
        if (/*teste positivo*) {
            codFloat = atof(ultimoPag.getCodigoPagamento.getInput().c_str());
            ss << (codFloat+1);
        }
    }
    catch(EErroPersistencia exp) {
        cout << endl << exp.oQue();
        cout << endl << endl << "Digite algo para continuar.";
        getch();
    }*/

    if (codFloat == 0.0) {
        pag.setNumeroPagamento(NumeroPagamento("000001"));
    }
    else {
        pag.setNumeroPagamento(NumeroPagamento(ss.str()));
    }


    ComandoAgendarPagamento comandoAP(pag, conta);
    /*try {
        comando.executar();
        //Pagamento pagRetorno;
        //pagRetorno = comando.getResultado();
        return pagRetorno.getCodigoPagamento().getInput();
    }
    catch(EErroPersistencia exp) {
        cout << endl << exp.oQue();
        cout << endl << endl << "Digite algo para continuar.";
        getch();
    }*/
}

bool MNConta::cancelarPag(CodigoPagamento cod, Conta conta)
{
    Pagamento pag;
    pag.setCodigoPagamento(cod);

    ComandoCancelarPagamento comando(pag, conta);
    /*try {
        comando.executar();
        return true;
    }
    catch(EErroPersistencia exp) {
        cout << endl << exp.oQue();
        cout << endl << endl << "Digite algo para continuar.";
        getch();
    }*/
    return false;

}

list<Pagamento> MNConta::listarPag(Conta conta)
{

    ComandoListarPagamentos comando(conta);
    /*try {
        comando.executar();
        list<Pagamento> pag;
        pag = comando.getResultado();
        return pag;
    }
    catch(EErroPersistencia exp) {
        cout << endl << exp.oQue();
        cout << endl << endl << "Digite algo para continuar.";
        getch();
    }*/

}


//-----------------------------------------------------------------------------------------
// METODOS DO MNGERENTE
//-----------------------------------------------------------------------------------------

string MNGerente::autenticar(Senha senha, Matricula matricula)
{
    Gerente gerente;
    gerente.setSenha(senha);
    gerente.setMatricula(matricula);

    /*ComandoAutenticarGerente comando(gerente);
    try {
        comando.executar();
        Gerente gerenteRetorno;
        gerenteRetorno = comando.getResultado();
        return gerenteRetorno.getNumeroConta().getInput();

    }
    catch(EErroPersistencia exp) {
        cout << endl << exp.oQue();
        cout << endl << endl << "Digite algo para continuar.";
        getch();
    }*/
}

Gerente MNGerente::getGerente(Matricula matricula)
{
    Gerente gerente;
    gerente.setMatricula(matricula);
    ComandoPegarGerente comando(gerente);

    /*try {
        comando.executar();
        Gerente gerenteRetorno;
        gerenteRetorno = comando.getResultado();
        return gerenteRetorno;


    }
    catch(EErroPersistencia exp) {
        cout << endl << exp.oQue();
        cout << endl << endl << "Digite algo para continuar.";
        getch();
    }*/
}

Conta MNGerente::getConta(NumeroConta numeroConta)
{
    Conta conta;
    conta.setNumeroConta(numeroConta);
    ComandoPegarConta comando(conta);

    /*try {
        comando.executar();
        Conta contaRetorno;
        contaRetorno = comando.getResultado();
        return contaRetorno;


    }
    catch(EErroPersistencia exp) {
        cout << endl << exp.oQue();
        cout << endl << endl << "Digite algo para continuar.";
        getch();
    }*/
}

string MNGerente::alterarSenha(Senha senha, Gerente gerente)
{
    gerente.setSenha(senha);
    ComandoAlterarSenhaGerente comando(gerente);

    /*try {
        comando.executar();
        Gerente gerenteRetorno;
        gerenteRetorno = comando.getResultado();
        return gerenteRetorno.getSenha().getInput();


    }
    catch(EErroPersistencia exp) {
        cout << endl << exp.oQue();
        cout << endl << endl << "Digite algo para continuar.";
        getch();
    }*/
}

string MNGerente::abrirConta(Nome nome, TipoConta tipoConta, Dinheiro limiteCredito)
{
    Conta conta;
    conta.setNome(nome);
    conta.setTipoConta(tipoConta);
    conta.setLimiteCredito(limiteCredito);

    ComandoCriarConta comando(conta);
    /*try {
        comando.executar();
        Conta contaRetorno;
        contaRetorno = comando.getResultado();
        return contaRetorno.getNome().getInput();


    }
    catch(EErroPersistencia exp) {
        cout << endl << exp.oQue();
        cout << endl << endl << "Digite algo para continuar.";
        getch();
    }*/

}

bool MNGerente::fecharConta(NumeroConta numeroConta)
{
    Conta conta;
    conta.setNumeroConta(numeroConta);

    ComandoFecharConta comando(conta);
    /*try {
        comando.executar();
        return true;


    }
    catch(EErroPersistencia exp) {
        cout << endl << exp.oQue();
        cout << endl << endl << "Digite algo para continuar.";
        getch();
    }*/
    return false;
}

bool MNGerente::bloquearConta(NumeroConta numeroConta)
{
    Conta conta;
    conta.setNumeroConta(numeroConta);

    ComandoFecharConta comando(conta);
    /*try {
        comando.executar();
        return true;


    }
    catch(EErroPersistencia exp) {
        cout << endl << exp.oQue();
        cout << endl << endl << "Digite algo para continuar.";
        getch();
    }*/
    return false;
}

bool MNGerente::desbloquearConta(NumeroConta numeroConta)
{
    Conta conta;
    conta.setNumeroConta(numeroConta);

    ComandoFecharConta comando(conta);
    /*try {
        comando.executar();
        return true;


    }
    catch(EErroPersistencia exp) {
        cout << endl << exp.oQue();
        cout << endl << endl << "Digite algo para continuar.";
        getch();
    }*/
    return false;
}

list<Conta> MNGerente::listarContas()
{
    ComandoListarContas comando();
    /*try {
        comando.executar();
        list<Conta> contas;
        contas = comando.getResultado();
        return contas;
    }
    catch(EErroPersistencia exp) {
        cout << endl << exp.oQue();
        cout << endl << endl << "Digite algo para continuar.";
        getch();
    }*/
}

bool MNGerente::alterarConta(Nome nome, TipoConta tipoConta, Dinheiro limiteCredito, Conta conta)
{
    conta.setNome(nome);
    conta.setTipoConta(tipoConta);
    conta.setLimiteCredito(limiteCredito);

    ComandoAlterarDadosConta comando(conta);
    /*try {
        comando.executar();
        return true;
    }
    catch(EErroPersistencia exp) {
        cout << endl << exp.oQue();
        cout << endl << endl << "Digite algo para continuar.";
        getch();
    }*/
    return false;
}

//-----------------------------------------------------------------------------------------
// METODOS DO MNADMIN
//-----------------------------------------------------------------------------------------

string MNAdmin::autenticar(Senha senha)
{
    Administrador admin;
    admin.setSenha(senha);


    ComandoAutenticarAdministrador comando(admin);
    try {
        comando.executar();
        Administrador adminRetorno;
        adminRetorno = comando.getResultado();
        return adminRetorno.getSenha().getInput();

    }
    catch(EErroPersistencia exp) {
        cout << endl << exp.oQue();
        cout << endl << endl << "Digite algo para continuar.";
        getch();
    }

}

string MNAdmin::cadastrarAdministrador(Senha senha)
{
    Administrador admin;
    admin.setSenha(senha);

    ComandoCriarAdministrador comando(admin);
    /*try {
        comando.executar();
        Administrador adminRetorno;
        adminRetorno = comando.getResultado();
        return adminRetorno.getSenha().getInput();

    }
    catch(EErroPersistencia exp) {
        cout << endl << exp.oQue();
        cout << endl << endl << "Digite algo para continuar.";
        getch();
    }*/
}

Administrador MNAdmin::getAdministrador(Senha senha)
{
    Administrador admin;
    admin.setSenha(senha);
    ComandoPegarAdministrador comando(admin);

    /*try {
        comando.executar();
        Administrador adminRetorno;
        adminRetorno = comando.getResultado();
        return adminRetorno;


    }
    catch(EErroPersistencia exp) {
        cout << endl << exp.oQue();
        cout << endl << endl << "Digite algo para continuar.";
        getch();
    }*/
}

Gerente MNAdmin::getGerente(Matricula matricula)
{
    Gerente gerente;
    gerente.setMatricula(matricula);

    ComandoPegarGerente comando(gerente);

    /*try {
        comando.executar();
        Gerente gerenteRetorno;
        gerenteRetorno = comando.getResultado();
        return gerenteRetorno;


    }
    catch(EErroPersistencia exp) {
        cout << endl << exp.oQue();
        cout << endl << endl << "Digite algo para continuar.";
        getch();
    }*/
}

string MNAdmin::alterarSenha(Senha senha, Administrador admin)
{
    admin.setSenha(senha);

    /*try {
        comando.executar();
        Administrador adminRetorno;
        adminRetorno = comando.getResultado();
        return adminRetorno.getSenha().getInput();

    }
    catch(EErroPersistencia exp) {
        cout << endl << exp.oQue();
        cout << endl << endl << "Digite algo para continuar.";
        getch();
    }*/
}

string MNAdmin::cadastrarGerente(Nome nome, Matricula matricula)
{
    Gerente gerente;
    gerente.setNome(nome);
    gerente.setMatricula(matricula);

    ComandoCriarGerente comando(gerente);
    /*try {
        comando.executar();
        Gerente gerenteRetorno;
        gerenteRetorno = comando.getResultado();
        return gerenteRetorno.getNome().getInput();

    }
    catch(EErroPersistencia exp) {
        cout << endl << exp.oQue();
        cout << endl << endl << "Digite algo para continuar.";
        getch();
    }*/
}

list<Gerente> MNAdmin::listarGerentes()
{
    ComandoListarGerentes comando();
    /*try {
        comando.executar();
        list<Gerente> gerentes;
        gerentes = comando.getResultado();
        return gerentes;
    }
    catch(EErroPersistencia exp) {
        cout << endl << exp.oQue();
        cout << endl << endl << "Digite algo para continuar.";
        getch();
    }*/
}

bool MNAdmin::alterarGerente(Nome nome, Gerente gerente)
{
    gerente.setNome(nome);
    ComandoAlterarDadosGerente comando(gerente);
    /*try {
        comando.executar();
        return true;
    }
    catch(EErroPersistencia exp) {
        cout << endl << exp.oQue();
        cout << endl << endl << "Digite algo para continuar.";
        getch();
    }*/
    return false;
}

bool MNAdmin::removerGerente(Matricula matricula) {
    Gerente gerente;
    gerente.setMatricula(matricula);

    ComandoRemoverGerente comando(gerente);
    /*try {
        comando.executar();
        return true;
    }
    catch(EErroPersistencia exp) {
        cout << endl << exp.oQue();
        cout << endl << endl << "Digite algo para continuar.";
        getch();
    }*/
    return false;

}
